package com.lu;

import cn.hutool.json.JSONUtil;

import java.util.Arrays;

/**
 * 给你两个正整数数组 spells 和 potions ，长度分别为 n 和 m ，其中 spells[i] 表示第 i 个咒语的能量强度，potions[j] 表示第 j 瓶药水的能量强度。
 * <p>
 * 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ，那么它们视为一对 成功 的组合。
 * <p>
 * 请你返回一个长度为 n 的整数数组 pairs，其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。
 * <p>
 * 示例 1：
 * <p>
 * 输入：spells = [5,1,3], potions = [1,2,3,4,5], success = 7
 * 输出：[4,0,3]
 * 解释：
 * - 第 0 个咒语：5 * [1,2,3,4,5] = [5,10,15,20,25] 。总共 4 个成功组合。
 * - 第 1 个咒语：1 * [1,2,3,4,5] = [1,2,3,4,5] 。总共 0 个成功组合。
 * - 第 2 个咒语：3 * [1,2,3,4,5] = [3,6,9,12,15] 。总共 3 个成功组合。
 * 所以返回 [4,0,3] 。
 */

public class LC2300 {

    /**
     * 2300. 咒语和药水的成功对数
     *
     * @param spells
     * @param potions
     * @param success
     * @return
     */
    public int[] successfulPairs(int[] spells, int[] potions, long success) {
        int plen = potions.length;
        int slen = spells.length;
        int[] res = new int[slen];
        Arrays.sort(potions);
        Arrays.fill(res, 0);
        for (int i = 0; i < slen; i++) {
            res[i] = countTheNumber(spells[i], potions, success);
        }
        return res;
    }

    /**
     * 统计a 和 b[i]相乘大于c的个数
     *
     * @param a 数
     * @param b 数组
     * @param c 目标数
     * @return 统计个数
     */
    public int countTheNumber(int a, int[] b, long c) {
        int left = 0;
        int index = b.length;
        int right = b.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if ((long)b[mid] * a >= c) {  // 使用long避免溢出
                index = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return b.length - index;
    }

    public static void main(String[] args) {
        LC2300 lc2300 = new LC2300();
        int[] res = lc2300.successfulPairs(new int[]{3, 1, 2}, new int[]{8, 5, 8}, 16);
        System.out.println(JSONUtil.toJsonStr(res));
    }

}
